第21.4节描述了一种技术，其允许为特定参数提供非默认模板参数，而不必指定可以使用默认值的其他模板参数，但需要大量的工作才能得到相对简单的效果。因此，很自然的会想到使用一种语言机制来命名模板参数。

类似的扩展(有时称为关键字参数)是由Roland Hartinger在C++标准化过程中提出的(参见[StroustrupDnE]第6.5.1节)。虽然在技术上合理，但该提议最终没有接受。我们不知道命名模板参数会是否会成为C++的一部分，但是这个话题会在委员会的讨论中经常出现。

为了完整起见，这里说一个已经讨论过的语法概念:

\begin{lstlisting}[style=styleCXX]
template<typename T,
	typename Move = defaultMove<T>,
	typename Copy = defaultCopy<T>,
	typename Swap = defaultSwap<T>,
	typename Init = defaultInit<T>,
	typename Kill = defaultKill<T>>
class Mutator {
	...
};

void test(MatrixList ml)
{
	mySort (ml, Mutator <Matrix, .Swap = matrixSwap>);
}
\end{lstlisting}

参数名称前的句点用来表示我们通过名称引用模板参数，这种语法类似于1999年C标准中引入的“指定初始化式”语法:

\begin{lstlisting}[style=styleCXX]
struct Rectangle { int top, left, width, height; };
struct Rectangle r = { .width = 10, .height = 10, .top = 0, .left = 0 };
\end{lstlisting}

当然，引入命名模板参数意味着模板的模板参数名称现在是该模板的公共接口的一部分，不能随意更改。这可以通过更明确的、可选择的语法来解决，例如:

\begin{lstlisting}[style=styleCXX]
template<typename T,
	Move: typename M = defaultMove<T>,
	Copy: typename C = defaultCopy<T>,
	Swap: typename S = defaultSwap<T>,
	Init: typename I = defaultInit<T>,
	Kill: typename K = defaultKill<T>>
class Mutator {
	...
};

void test(MatrixList ml)
{
	mySort (ml, Mutator <Matrix, .Swap = matrixSwap>);
}
\end{lstlisting}









































